// 08-memoize.js:   纯函数可缓存

const _ = require('lodash');


function getArea(r) {
    console.log('r', r);
    return Math.PI * r * r;
}

// //memoize：记忆函数(可以看出memoize的使用是传入一个函数，并且返回一个函数)
// let getAreaWithMemory = _.memoize(getArea);

// //查看控制台输出可以观察到，打印了3次area，但是r只打印了一次。证明函数getArea只执行了一次，再次执行的时候它是从缓存中读取的数据
// console.log('area', getAreaWithMemory(4));
// console.log('area', getAreaWithMemory(4));
// console.log('area', getAreaWithMemory(4));


//模拟 memoize 方法的实现

function memoize(f) {
    let cache = {};
    return function () {
        let key = JSON.stringify(arguments);
        cache[key] = cache[key] || f.apply(this, arguments);
        return cache[key];
    }
}

let getAreaWithMemory = memoize(getArea);
console.log('area', getAreaWithMemory(4));
console.log('area', getAreaWithMemory(4));
console.log('area', getAreaWithMemory(4));
